package ms;

class Singleton {
    private static Singleton instance; // ❌ 没有 volatile，可能会导致指令重排序问题
    private int value;

    private Singleton() {
        // 模拟初始化时间
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        value = 42; // 设定某个值

        // 让线程更容易切换，增加指令重排序发生的概率
        Thread.yield();
    }

    public static Singleton getInstance() {
        if (instance == null) { // 🔴 线程 A 和 B 可能同时进入这里
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton(); // 可能指令重排序，instance 非空但未初始化完全
                }
            }
        }
        return instance;
    }

    public int getValue() {
        return value;
    }
}

public class SingletonTest {
    public static void main(String[] args) {
        Runnable task = () -> {
            Singleton instance = Singleton.getInstance();
            System.out.println(Thread.currentThread().getName() + " - Value: " + instance.getValue());
        };

        // 创建更多线程
        for (int i = 0; i < 10000; i++) {
            new Thread(task, "Thread-" + i).start();
        }
    }
}
